package impl

import (
	"context"
	"net/http"

	"gitee.com/go-course/go11/vblog/apps/blog"
	"gitee.com/go-course/go11/vblog/common"
)

// ctx: Context上下文, 一个接口或者函数, 他的参数保护2类数据:
// 1. 用户传递过来的数据: in *blog.Blog
// 2. 还有1类数据 不是通过用户传递的, 比如Trace, RequestId
func (i *Impl) CreateBlog(ctx context.Context, in *blog.CreateBlogRequest) (
	*blog.Blog, error) {

	// 检查用户的参数
	if err := in.Validate(); err != nil {
		// 我这里就想返回一个业务异常?
		// 当前Error里面不保护异常码信息?
		return nil, common.NewApiException(http.StatusBadRequest, err.Error())
	}

	// 生成一个blog对象
	// ins := blog.Blog{
	// 	Meta:              &blog.Meta{},
	// 	CreateBlogRequest: &blog.CreateBlogRequest{},
	// }
	// ins.CreateBlogRequest.Extra 这个map 就没有初始化, 很容易报空指针错误
	// 代码不具有可兼容

	// 使用构造函数来创建一个对象
	ins := blog.NewBlog(in)

	// 直接和数据库交互
	// 尽量不要直接这样写？ 比如用户提交一个请求
	// INSERT INTO `blogs` (`created_at`,`updated_at`,`published_at`,`title`,`author`,`content`,`tags`,`status`)
	// VALUES (1684566571,1684566571,0,'test','test','test','{}','0')
	err := i.db.WithContext(ctx).Save(ins).Error
	if err != nil {
		return nil, common.NewApiException(http.StatusInternalServerError, err.Error())
	}

	return ins, nil
}

// 查询文章列表
func (i *Impl) QueryBlog(context.Context, *blog.QueryBlogRequest) (
	*blog.BlogSet, error) {
	return nil, nil
}

// 查询单个文章
func (i *Impl) DescribeBlog(context.Context, *blog.DescribeBlogRequest) (
	*blog.Blog, error) {
	return nil, nil
}

// 更新文章
func (i *Impl) UpdateBlog(context.Context, *blog.UpdateBlogRequest) (
	*blog.Blog, error) {
	return nil, nil
}

// 删除文章, 返回删除的对象, 用前端提升, 用于对象最终
func (i *Impl) DeleteBlog(context.Context, *blog.DeleteBlogRequest) (
	*blog.Blog, error) {
	return nil, nil
}
